/*
 * @Author: '浪川' '1214391613@qq.com'
 * @Date: 2025-07-08 14:40:54
 * @LastEditors: '浪川' '1214391613@qq.com'
 * @LastEditTime: 2025-08-09 10:11:14
 * @FilePath: \passiflora-edulis-sims\src\utils\LeaferUtil.ts
 * @Description: 这是一个关于Leafer JS 的实用库，目的是为了更方便使用Leaferjs
 *
 * Copyright (c) 2025 by '1214391613@qq.com', All Rights Reserved.
 */

import type { IStroke, IStrokePaint } from 'leafer-ui'
import { BoxText } from 'src/components/MyLeaferCutom'
import type { IText, IUnit } from 'src/interfaces/IBook'

/**
 * 定义 `leafer_position`的选项类型
 * @property {number} x: 下标，通常为数组的横向下标
 * @property {number} y: 下标，通常为数组的纵向下标
 * @property {number} width: UI的宽度
 * @property {number} height: UI的高度
 * @property {number} stroke_width: UI的组件的内描边宽度
 * @property {number} white_border: 对于当前UI的两侧留白
 * @property {number} x_offet: x轴方向的偏移值
 * @property {number} y_offet: y轴方向的偏移值
 * @property {number} x_interval: x 方向上的 每个 元素的间隔
 * @property {number} y_interval: y 方向上的 每个元素的间隔
 */
interface ILeaferPosition {
  x?: number
  y?: number
  width?: number
  height?: number
  stroke?: IStrokePaint
  white_border?: number
  x_offet?: number
  y_offet?: number
  x_interval?: number
  y_interval?: number
}
/**
 * @description: box 的宽度 * 当前的列 + 100的两边留白 + box 的描边宽度 * 当前列 + 前一个Box的位置 + 500的间隔
 * @param {ILeaferPosition} data: 计算 Leaferjs 真实 坐标的位置的参数类型
 * @return {*}: [x, y] 这是一个 真实的 绘制在 leaferjs 坐标的位置
 */
export const leafer_position = (data: ILeaferPosition): [number, number] => {
  const {
    x = 0,
    y = 0,
    width = 0,
    height = 0,
    stroke,
    white_border = 0,
    x_offet = 0,
    y_offet = 0,
    x_interval = 0,
    y_interval = 0,
  } = data
  let stroke_width = 1
  if (stroke !== undefined) {
    stroke_width = stroke.style?.strokeWidth as number
  }

  const real_x =
    width * x - stroke_width * x + white_border + x_offet + x_interval * x
  const real_y =
    height * y - stroke_width * y + white_border + y_offet + y_interval * y

  return [real_x, real_y]
}

export function x_center_position(width: number, canvas_w: number) {
  const x = canvas_w / 2 - width / 2
  return x
}
/**
 * @description: 将textare 区域的文本值改为s
 * @param {string} text: 一段文本行
 * @param [separator='\n'] : 切割条件
 * @return {*} Record<string, string>
 */
export function string2List(text: string, separator: string = '\n'): string[] {
  const wds: string[] = []
  text.split(separator).forEach((line) => {
    if (!line.trim()) return // 跳过空行

    wds.push(line.trim()) // 处理值中可能包含的冒号
  })

  return wds
}
/**
 * @description: 创建一个Box-Text UI
 * @property {*} x: x轴坐标
 * @property {*} y: y 轴坐标
 * @property {IText} text: Itext 对象
 * @property {IStroke*} stroke: IStroke 对象
 * @property {number} width: 方框宽度
 * @property {number} height: 方框高度
 * @return {*}: BoxText组件样式
 */
interface CreateBoxTextParams {
  x: number
  y: number
  text: string
  text_style: IText
  stroke: IStroke
  width: number
  height: number
}

/**
 * @description: 创建一个Box-Text UI
 * @param {CreateBoxTextParams} `param`: CreateBoxTextParams类型数据
 * @return {*}: BoxText组件样式
 */
export function create_boxtext(param: CreateBoxTextParams) {
  const { x, y, text, text_style, stroke, width = 500, height = 500 } = param
  const box = new BoxText({
    text: text,
    text_color: text_style.font.font_color,
    text_align: text_style.text_align,
    vertical_align: text_style.vertical_align,
    font_size: text_style.font.font_size,
    font_name: text_style.font.font_name,
    width: width,
    height: height,
    x: x,
    y: y,
    editable: true,
    stroke: stroke,
    hitChildren: false, // 阻止直接选择子元素（防止父子选择冲突，可双击进入组内选择子元素）
  })
  return box
}

/**
 * @description: 计算不同单位下的像素数量
 * @param {number} num: 尺寸
 * @param {IUnit} unit: 单位
 * @param {number} ppi: 像素/英寸
 * @return {*}: 像素值
 */
export function unit2px(num: number, unit: IUnit, ppi: number) {
  // 转换为英寸（基准单位）
  let inches: number = 0
  switch (unit) {
    case 'in':
      inches = num
      break
    case 'cm':
      inches = num / 2.54 // 1英寸 = 2.54厘米
      break
    case 'mm':
      inches = num / 25.4 // 1英寸 = 25.4毫米
      break
    default:
      throw new Error(`不支持的单位: "${unit}"。请使用in、cm或mm`)
  }

  // 计算像素值并四舍五入
  return Math.round(inches * ppi)
}
